// https://leetcode.cn/problems/3sum-closest/
// 最接近的三数之和
// 思路：双指针
/**
 * 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数，使它们的和与 target 最接近。

返回这三个数的和。

假定每组输入只存在恰好一个解。

 

示例 1：

输入：nums = [-1,2,1,-4], target = 1
输出：2
解释：与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
示例 2：

输入：nums = [0,0,0], target = 1
输出：0

 */

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var threeSumClosest = function (nums, target) {
    if (nums.length < 3) {
        return 0;
    }

    nums.sort((a, b) => a - b);

    let min = Number.MAX_SAFE_INTEGER;
    let result = Number.MAX_SAFE_INTEGER;
    for (let i = 0; i < nums.length - 2; i++) {
        let left = i + 1;
        let right = nums.length - 1;

        const cur = nums[i];
        while (left < right) {
            const curLeft = nums[left];
            const curRight = nums[right];

            console.log(
                `cur: ${cur}, curLeft: ${curLeft}, curRight: ${curRight}`
            );

            const sum = nums[i] + nums[left] + nums[right];

            if (sum > target) {
                right--;
            } else if (sum < target) {
                left++;
            } else {
                console.log(
                    `${sum} for ${JSON.stringify(nums)}, target: ${target}`
                );
                return sum;
            }

            let delta = Math.abs(target - sum);

            if (min > delta) {
                min = delta;
                result = sum;
            }
        }
    }

    console.log(`${result} for ${JSON.stringify(nums)}, target: ${target}`);
    return result;
};

threeSumClosest([-1, 2, 1, -4], 1); // 2
threeSumClosest([0, 0, 0], 1); // 0
threeSumClosest([1, 0, 0], 1); // 1
threeSumClosest([4, 0, 5, -5, 3, 3, 0, -4, -5], -2); // -2
